// Description: 描述
package set

type (
	Set interface {
		// 向set添加元素
		Add(i interface{}) bool
		// 测试传入的数组是否在set中
		Contains(i ...interface{}) bool
		// 获取字典长度
		Len() int
	}
)

type cusSet map[interface{}]struct{}

func NewSet(s ...interface{}) Set {
	set := make(cusSet)
	for _, item := range s {
		set.Add(item)
	}
	return &set
}

func (set *cusSet) Add(i interface{}) bool {
	_, found := (*set)[i]
	if found {
		return false // False if it existed already
	}

	(*set)[i] = struct{}{}
	return true
}

func (set *cusSet) Contains(i ...interface{}) bool {
	for _, val := range i {
		if _, ok := (*set)[val]; !ok {
			return false
		}
	}
	return true
}

func (set *cusSet) Len() int {
	return len(*set)
}
